【DeepRacer】ワークショップに参加してきたので初心者なりに色々いじってみる #AWSSummit #AWSDeepRacer #AWSDeepRacerJP
こんにちは、Mr.Moです。
2019年 6月 12日(水) 〜 14日(金) 幕張メッセにてAWSに関する情報交換やコラボレーション、学習を行うことができる日本最大級のカンファレンス AWS Summit Tokyo 2019が開催されました。
そこで強化学習を楽しく学べるサービスDeepRacerのワークショップに参加してきました。さっそく学んだことをもとに自分なりにいじっていきたいと思います。
ちなみにSummit中のDeepRacerリーグの雰囲気は下記をご参照ください。
DeepRacerワークショップの概要
AWS DeepRacer は、 1/18 スケールのレーシングカーを利用して、強化学習を楽しみながら理解できるサービスです。強化学習に必要な環境はすべて AWS DeepRacer によって提供され、ユーザはレーシングカーを上手く走らせるための強化学習に集中することができます。AWS DeepRacer ワークショップでは、強化学習を体験しながら、実際のレーシングカーを走らせる方法をお伝えします。具体的には、強化学習の基礎的な内容を紹介し、コンソールの利用方法や、レーシングカーが走る様子をシミュレーションで確認する方法をご説明します。
スピーカー
アマゾン ウェブ サービス ジャパン株式会社
技術統括本部
ソリューションアーキテクト
鮫島 正樹
ワークショップの詳しい内容は下記の記事をご参照ください。
本記事の目的
世界リーグで勝てる完全自走型のMyレーシングカーのモデルを作るため、まずは初心者なりの第一歩を踏み出します。 また、そのために何をしないといけないのかをワークショップでいただいた情報から探してみたいと思います。
今回選択する仮想コースは下記の「re:Invent 2018」です。(ちなみに、モデルのトレーニングを行うときは、参加したいレースのトラックに似ている仮想コースを選択するのが良さそうです)
ワークショップのドキュメントを読む
ワークショップのドキュメントはこちらです。
ドキュメントを見ると下記の設定を主にいじっていくことが分かります。
- Action space
- 報酬関数
- ハイパーパラメータ
Action space を設定してみる
トレーニング中や、トレーニング済みのモデルから選択したAction spaceを設定します。Actionとは、速度とステアリング角の組み合わせです。クルマが取れる行動を定義します。
Steering angle granularity の値は上記の赤丸と青丸のカーブがだいたい同じ角度に見え、するとパターンはあまり必要無さそうと思い 30度,15度、0度 の角度があれば充分と判断、設定値を「5」としました。 Maximum speedの値は長いストレートなトラック部分を活かすためにMaxである「8」を設定。Speed granularityは「2」でもいけるかと思いましたが、上記の赤丸部分がスピードをそこそこ落とさないと曲がるのが厳しいかなぁと思い悩んだ末「3」と設定しました。
報酬関数を作ってみる
強化学習において、報酬関数はある行動から得られる結果を評価し、その行動に報酬を与えます。
報酬関数で使える変数を見てみる
変数名 | シンタックス | 型 | 説明 |
---|---|---|---|
all_wheels_on_track | params['all_wheels_on_track'] | Boolean | 4輪全てがトラック(走行路または線)上にある場合、all_wheels_on_track は True となります。1輪でもトラックの外にある場合、all_wheels_on_track は False となります。 |
x | params['x'] | Float | 車の前車軸の中心の x 座標をメートル単位で返します。 |
y | params['y'] | Float | 車の前車軸の中心の y 座標をメートル単位で返します。 |
distance_from_center | params['distance_from_center'] | Float [0, track_width/2] | トラックの中心からの絶対距離。トラックの中心は全ての waypoints の中心が繋げられた線により定義されます。 |
is_left_of_center | params['is_left_of_center'] | Boolean | 車がトラックの中心から左側に位置するかどうかを示します。 |
is_reversed | params['is_reversed'] | Boolean | 車がトラックの順方向でトレーニングしているのか、逆方向でトレーニングしているのか。 |
heading | params['heading'] | Float (-180,180] | 車の先頭の向いている角度を示します。x 軸が増加する方向(y 軸は固定)に向いている場合、0を返します。y 軸が増加する方向(x 軸は固定)の場合、90 を返します。y 軸が減少する方向(x 軸は固定)の場合、-90 を返します。 |
progress | params['progress'] | Float [0,100] | 完了したトラックの割合をパーセンテージで示します。100 はラップの完了を示します。 |
steps | params['steps'] | Integer [0,inf] | 完了したステップを返します。 1ステップは1つの (state, action, next state, reward) タプルに対応します。 |
speed | params['speed'] | Float | 期待する車のスピードがメートル/秒で返されます。これは選択されたアクションに結び付けられます。 |
steering_angle | params['steering_angle'] | Float | 度単位で表される、ステアリングの角度。定義した Action Space に紐づきます。注: 正の値は左向きを表し、負の値は右向きを表します。これは2次元平面上で処理されます。 |
track_width | params['track_width'] | Float | トラックの幅を表します |
waypoints | params['waypoints'] for the full list or params['waypoints'][i] for the i-th waypoint | List | トラックの中心の順序付きリストで、各要素は (x, y) 座標です。リストのインデックスは 0 から始まります。 |
closest_waypoints | params['closest_waypoints'][0] or params['closest_waypoints'][1] | Integer | 車の現在地から最も近い waypoint のインデックス。params['closest_waypoints'][0] は後方のインデックスを、params['closest_waypoints'][1] は前方のインデックスを示します。 |
左曲がりオンリーのコースであればis_left_of_centerを使えば簡単にインコースを攻められそう!と思いましたが「re:Invent 2018」の仮想コースは右曲がりもありますね。。そもそもインコースを攻め続ければ良いタイムに繋がるというものでもないかもしれません。
では、トラックのどの段階に来た時に道幅のどの位置にいるのが良いかを細かく制御するには closest_waypoints が下記の図のようなイメージとすると使えそうでしょうか。あと distance_from_center 、 track_width 、 is_left_of_center あたりも必要になってくるのではないかと思います。
ただ、多くのパターンを網羅するような報酬関数は関数を作る工程だけで相当時間を使いそうですね。。
最終的に作った報酬関数
最終的に4輪全てがトラック上にあればOKにしました、自由です!細かく指示するよりスピードにのってもらって、あとは臨機応変に対応してもらおうという作戦です。この方が強化学習っぽい感じしませんか?(筆者は強化学習初心者です)
def reward_function(params): # パラメーターのセット all_wheels_on_track = params['all_wheels_on_track'] speed = params["speed"] # デフォルトの報酬 reward = 1e-3 # 4輪全てがトラック上にある時にスピードにおうじて報酬をUP if all_wheels_on_track: reward = (speed**2)/100 return float(reward)
学習結果
4時間学習させた結果が上記です。AWS Summit Tokyo 2019 のリーグの順位でいうと50位〜100位ぐらいでしょうか。普通ぐらいのタイムになりますね。 また、今回は使いませんでしたがprogressやstepsといった報酬関数で使える変数にも可能性を感じています。
ちなみにハイパーパラメータはいじってません。まずは「Action space 設定」と「報酬関数」を試行錯誤した後にハイパーパラメータの設定をいじるのがおすすめの流れとのことでした。
作業後のお掃除
初期Setup時に作成したAWSの各種リソースで課金が発生し続けている状態です。作業が終わったらResetして不要な課金を抑えましょう!
ちなみに
DeepRacerではcloneする機能があり、こちらを使うと前回のモデルから追加学習できるみたいです。 学習の仕方も一気に実施したり、追加学習を駆使したり工夫する余地がありそうですね。
まとめ
ワークショップの説明が非常に丁寧だったのとDeepRacerが強化学習を上手くラップしてくれているおかげで初心者でも簡単に始められました。また実際に動くものを試行錯誤して作っていくのは楽しいですね。ドハマリすると永遠に時間を費やしそうです(笑)。